sysroot: Sort returned boot loader configs
authorColin Walters <walters@verbum.org>
Tue, 26 May 2015 22:46:47 +0000 (18:46 -0400)
committerColin Walters <walters@verbum.org>
Thu, 28 May 2015 18:21:30 +0000 (14:21 -0400)
I haven't done a full dig through the history, but it seems quite
possible right now we've been relying on inode enumeration
order for generating bootloader configuration.

Most of the time, newer inodes (i.e. later written files) will win.
But that's obviously not reliable.

Fix this by sorting the returned configuration internally.

src/libostree/ostree-sysroot.c

index ebcb63296984a59ab793998a28007560938ccaf9..f12ebc58f7b8ad415961f6a9063e164b9ff0fe51 100644 (file)
@@ -361,6 +361,35 @@ _ostree_sysroot_read_current_subbootversion (OstreeSysroot *self,
   return ret;
 }
 
+static gint
+compare_boot_loader_configs (OstreeBootconfigParser     *a,
+                             OstreeBootconfigParser     *b)
+{
+  const char *a_version = ostree_bootconfig_parser_get (a, "version");
+  const char *b_version = ostree_bootconfig_parser_get (b, "version");
+
+  if (a_version && b_version)
+    {
+      int r = strverscmp (a_version, b_version);
+      /* Reverse */
+      return -r;
+    }
+  else if (a_version)
+    return -1;
+  else
+    return 1;
+}
+
+static int
+compare_loader_configs_for_sorting (gconstpointer  a_pp,
+                                    gconstpointer  b_pp)
+{
+  OstreeBootconfigParser *a = *((OstreeBootconfigParser**)a_pp);
+  OstreeBootconfigParser *b = *((OstreeBootconfigParser**)b_pp);
+
+  return compare_boot_loader_configs (a, b);
+}
+
 gboolean
 _ostree_sysroot_read_boot_loader_configs (OstreeSysroot *self,
                                           int            bootversion,
@@ -427,6 +456,9 @@ _ostree_sysroot_read_boot_loader_configs (OstreeSysroot *self,
         }
     }
 
+  /* Callers expect us to give them a sorted array */
+  g_ptr_array_sort (ret_loader_configs, compare_loader_configs_for_sorting);
+
  done:
   gs_transfer_out_value (out_loader_configs, &ret_loader_configs);
   ret = TRUE;
@@ -706,19 +738,8 @@ compare_deployments_by_boot_loader_version_reversed (gconstpointer     a_pp,
   OstreeDeployment *b = *((OstreeDeployment**)b_pp);
   OstreeBootconfigParser *a_bootconfig = ostree_deployment_get_bootconfig (a);
   OstreeBootconfigParser *b_bootconfig = ostree_deployment_get_bootconfig (b);
-  const char *a_version = ostree_bootconfig_parser_get (a_bootconfig, "version");
-  const char *b_version = ostree_bootconfig_parser_get (b_bootconfig, "version");
-  
-  if (a_version && b_version)
-    {
-      int r = strverscmp (a_version, b_version);
-      /* Reverse */
-      return -r;
-    }
-  else if (a_version)
-    return -1;
-  else
-    return 1;
+
+  return compare_boot_loader_configs (a_bootconfig, b_bootconfig);
 }
 
 /**